package cn.fansunion.leecode.isNumber;

/**
 * 验证回文串
 * 给定一个字符串，验证它是否是回文串，只考虑字母和数字字符，可以忽略字母的大小写。

说明：本题中，我们将空字符串定义为有效的回文串。
https://leetcode-cn.com/problems/valid-palindrome/
 * @author wen.lei@brgroup.com
 *
 * 2022-2-18
 */
public class ValidPalindrome {

    /* 示例 1:
    
        输入: "A man, a plan, a canal: Panama"
        输出: true
        解释："amanaplanacanalpanama" 是回文串
        示例 2:
    
        输入: "race a car"
        输出: false
        解释："raceacar" 不是回文串*/
    /**
     * 从字符串中找出“字母数字”的字符串，复用之前一道题的方法。换汤不换药，新瓶装旧酒。
     * @param s
     * @return
     */
    public boolean isPalindrome(String s) {
        if(s==null||s.length()==0) {
            return false;
        }
        //cn.fansunion.leecode.isNumber.PalindromeNumber.isPalindromeStr(int)
        //整数版回文数的进阶，同一个问题，稍微有点区别。相同点，都需要对输入做一点处理
        String newStr=collectLetterDigit(s);
        return isPalindromeIntByStr(newStr);

    }
    
    /**
     * 从一个字符串中找出为字母或数字的字符，返回一个新的字符串，比如：“abc--]1 23”>"abc123"
     * @param s
     * @return
     */
    private String collectLetterDigit(String s) {
        StringBuilder sb = new StringBuilder();
        for(char ch:s.toLowerCase().toCharArray()) {
            if(Character.isLetterOrDigit(ch)) {
                sb.append(ch);
            }
        }
        return sb.toString();
    }

    //根据isPalindromeIntByStr，简单处理
    public boolean isPalindromeIntByStr(String numStr) {
        //左右比较，双指针
        for (int start = 0, end = numStr.length() - 1; start < end; start++, end--) {
            if (numStr.charAt(start)!=numStr.charAt(end)) {
                return false;
            }
        }
        return true;
    }
    
    /**
     * 仅供参考用：是否为回文数：number->str 进阶：你能不将整数转为字符串来解决这个问题吗？
     * @param x
     * @return
     */
    public boolean isPalindromeIntByStr(int x) {
        if (x < 0) {
            return false;
        }
        String numStr = String.valueOf(x);
        //左右比较，双指针
        for (int start = 0, end = numStr.length() - 1; start < end; start++, end--) {
            if (numStr.charAt(start)!=numStr.charAt(end)) {
                return false;
            }
        }
        return true;
    }
}
